/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package it.univaq.iw.jweb;

import it.univaq.iw.jweb.data.Curriculum;
import it.univaq.iw.jweb.data.DataAccess;
import it.univaq.iw.jweb.data.Patente;
import it.univaq.iw.jweb.data.Province;
import it.univaq.iw.jweb.data.Servizio;
import it.univaq.iw.jweb.utils.ControlsHelpers;
import it.univaq.iw.jweb.utils.SecurityHelpers;
import it.univaq.iw.jweb.utils.TemplateManager;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Stefano
 */
public class FormProcessAnagrafica extends HttpServlet {

    private TemplateManager tpl;
    private DataAccess da;

    @Override
    public void init() throws ServletException {
        super.init();
        da = DataAccess.getInstance();
        tpl = TemplateManager.getInstance(getServletContext());
        tpl.setOutlineTemplate("outline");
        tpl.setDefaultData("author", "Del Vecchio - Bevini - Delfino");
        tpl.setDefaultData("homepage_url", "home");
        tpl.setDefaultData("logged", true);

    }

    private void selezionaServizi (String email) throws ServletException {

        List<Servizio> servizi = da.searchServiziGruppo(da.searchNomeGruppo(email));

        /* preparo i servizi in base allo stato del candidato */
        Iterator<Servizio> it = servizi.iterator();
        while (it.hasNext()) {
            Servizio servizio = it.next();
            if (da.curriculumCompletoByMail(email)) { /* curriculum completato */

                if (servizio.getNome().equalsIgnoreCase("inserisciCurriculum")
                        || (da.hasPreferences(email) && servizio.getNome().equalsIgnoreCase("inserisciPreferenze"))) {

                    it.remove();

                } else if(servizio.getNome().equalsIgnoreCase("inserisciCurriculum")
                        || (!da.hasPreferences(email) && servizio.getNome().equalsIgnoreCase("modificaPreferenze"))) {

                    it.remove();
                }

            } else { /* curriculum incompleto */

                if (servizio.getNome().equalsIgnoreCase("inserisciPreferenze")
                        || servizio.getNome().equalsIgnoreCase("modificaPreferenze")
                        || servizio.getNome().equalsIgnoreCase("modificaCurriculum")
                        || servizio.getNome().equalsIgnoreCase("visualizzaCurriculum")
                        || servizio.getNome().equalsIgnoreCase("eliminaCurriculum")) {

                    it.remove();
                }
            }
        }
        tpl.setDefaultData("servizi", servizi);

    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        HttpSession s = SecurityHelpers.checkSession(request);

        if (s == null) {

            response.sendRedirect("home");

        } else {

            selezionaServizi(s.getAttribute("email").toString());
            PrintWriter out = response.getWriter();

            try {

                selezionaServizi(s.getAttribute("email").toString());

                Map datamodel = tpl.getDefaultDataModel();

                /* sessione */
                String emailSession = s.getAttribute("email").toString();
                

                /* dati da controllare */
                String nome = request.getParameter("nomeCandidato");
                
                String cognome = request.getParameter("cognomeCandidato");
                
                String data = request.getParameter("dataDiNascita");
                
                String sesso = request.getParameter("sesso");
                
                String indirizzo = request.getParameter("indirizzo");
        
                String cap = request.getParameter("cap");
                
                String citta = request.getParameter("citta");
              
                String provincia = request.getParameter("provincia");
               
                String email = request.getParameter("email");
             
                String telefono = request.getParameter("telefono");
              
                String automunito = request.getParameter("automunito");
              

                /* controllo le lunghezze dei campi inseriti */
                if (nome.isEmpty()) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci il nome.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,cap,indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return; /* per essere sicuro che esca */

                } else if (cognome.isEmpty()) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci il cognome.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,cap,indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return;

                } else if(ControlsHelpers.isDateValid(data) == null) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci correttamente la data di nascita.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,cap,indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return;

                } else if (indirizzo.isEmpty()) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci il tuo indirizzo.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,cap,indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return;

                } else if (cap.isEmpty() || !ControlsHelpers.controllaCAP(cap)) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci correttamente il cap.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,"",indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return;

                } else if(citta.isEmpty()) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci la città.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,cap,indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return;

                } else if(!ControlsHelpers.controllaMail(email)) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci correttamente l'indirizzo email.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,cap,indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return;

                } else if(provincia.equalsIgnoreCase("Provincia")) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci la provincia.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,cap,indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return;

                } else if( !telefono.isEmpty() && !ControlsHelpers.controllaNumeroTelefono(telefono)) {

                    datamodel.put("errore", "ATTENZIONE: Inserisci correttamente il numero di telefono.");
                    datamodel.put("provincie", Province.values());
                    datamodel.put("curriculum", new Curriculum(nome,cognome,ControlsHelpers.isDateValid(data),sesso,cap,indirizzo,citta,provincia,telefono,email,automunito));
                    datamodel.put("action", "formProcessAnagrafica");
                    tpl.setDefaultData("email", emailSession);
                    tpl.process("modificaAnagrafica", datamodel, out);
                    out.close();
                    return;

                } else { /* tutti i controlli sono andati a buon fine */

                    int idCurriculum = da.aggiungiCurriculum(new Curriculum(nome,
                            cognome,
                            ControlsHelpers.isDateValid(data),
                            sesso,
                            cap,
                            indirizzo,
                            citta,
                            provincia,
                            telefono, email, automunito), emailSession);

                    /* chiamo il seguente form */
                    datamodel.put("idCurriculum", idCurriculum);
                    datamodel.put("patentiList", da.getPatenti());
                    List<Patente> patenti = new ArrayList();
                    patenti.add(new Patente());
                    patenti.add(new Patente());

                    datamodel.put("patentiMod", patenti);
                    datamodel.put("action", "formProcessPatenti");
                    tpl.process("modificaPatenti", datamodel, out);
                    out.close();
                    return;
                }
                
            } finally {
                
                out.close();
            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
